<?php

// 策略模式
// 1、多个类只区别在表现行为不同，可以使用策略模式，在运行时动态选择具体要执行的行为
// 2、需要在不同情况下使用不同的策略(算法)，或者策略还可能在未来用其他方式来实现
// 3、对客户隐藏具体策略(算法)的实现细节，彼此完全独立
// 4、客户端必须知道所有的策略类，并自行决定使用哪一个策略，策略模式只适用于客户端知道
// 所有的算法或行为的情况
// 5、策略模式造成很多的策略类，每个具体策略类都会产生一个新类。
// 优点：
//  1、策略模式提供了管理相关的算法族的办法
//  2、算法封闭在独立的策略类中使得你可以独立于其上下文改变它
//  3、使用策略模式可以避免使用多重条件转移语句

use GirlFriend as GlobalGirlFriend;

interface Love
{
    function sajiao();
}

class KeAi implements Love
{
    function sajiao()
    {
        echo '讨厌，不理你了<br/>';
    }
}

class Tiger implements Love
{
    function sajiao()
    {
        echo '给老娘过来<br/>';
    }
}

class GirlFriend
{
    protected $xingge;

    function __construct($xingge)
    {
        $this->xingge = $xingge;
    }

    function sajiao()
    {
        $this->xingge->sajiao();
    }
}

// 测试
$xiaohua = new GlobalGirlFriend(new KeAi());
$xiaohua->sajiao();